﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Contract.Business.Process;
using Contract.Business.Entity;
using Contract.Business.Filter;
using GenericControlsWinForm.Extensions;

namespace Fast.Presentation.WinForms.Cruds
{
    public partial class FrmClienteReduzido : Form
    {
        public FrmClienteReduzido()
        {
            InitializeComponent();
        }

        #region Singleton
        private BPCliente bpCliente;
        private BPCliente processCliente
        {
            get
            {
                if (bpCliente == null)
                    bpCliente = new BPCliente();

                return bpCliente;
            }
        }

        private BPRegiaoEntrega bpRegiaoEntrega;
        private BPRegiaoEntrega processRegiaoEntrega
        {
            get
            {
                if (bpRegiaoEntrega == null)
                    bpRegiaoEntrega = new BPRegiaoEntrega();

                return bpRegiaoEntrega;
            }
        }
        #endregion
        
        #region *** Atributos ***

        public BECliente entidade;
        public bool realizandoVenda = false;
        public string telefone;

        #endregion

        #region *** Botões Crud ***
        private void btnNovo_Click(object sender, EventArgs e)
        {
            if (btnNovo.Text.Equals("Novo"))
            {
                LimparCampos();
                grbDados.Enabled = true;
                Utilidades.carregarNovo(grbBotoes);
            }
            else if (ValidarFormulario())
            {
                PreencherCampos();

                entidade = processCliente.Salvar(entidade);

                this.lblCodigo.Text = entidade.Codigo.ToString();

                Utilidades.ExibirMensagem("Cliente cadastrado.");

                if (realizandoVenda)
                    this.Close();
                else
                {
                    grbDados.Enabled = false;
                    Utilidades.carregarConfirmarNovo(grbBotoes);
                }
            }
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (btnAlterar.Text.Equals("Alterar"))
            {
                grbDados.Enabled = true;
                Utilidades.carregarAlterar(grbBotoes);
            }
            else if (ValidarFormulario())
            {
                PreencherCampos();

                processCliente.Salvar(entidade);

                Utilidades.ExibirMensagem("Cliente alterado.");
                grbDados.Enabled = false;
                Utilidades.carregarConfirmarAlterar(grbBotoes);
            }
        }

        private void btnConsultar_Click(object sender, EventArgs e)
        {
            FrmClienteConsultar frm = new FrmClienteConsultar();
            frm.ShowDialog();

            if (frm.entidade != null)
            {
                carregarCliente(frm.entidade);
                Utilidades.carregarConsultar(grbBotoes);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Deseja excluir este item?", "Fast Pizza", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                entidade = new BECliente();
                entidade.Codigo = int.Parse(this.lblCodigo.Text);

                processCliente.Excluir(entidade);

                LimparCampos();
                Utilidades.ExibirMensagem("Cliente excluído com sucesso.");
                grbDados.Enabled = false;
                Utilidades.carregarExcluir(grbBotoes);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (this.realizandoVenda)
                this.Close();
            else
            {
                LimparCampos();
                grbDados.Enabled = false;
                Utilidades.carregarCancelar(grbBotoes);
            }
        }
        #endregion

        #region *** Eventos ***

        private void FrmFrmCliente_Load(object sender, EventArgs e)
        {
            UtilidadesListas.carregarRegiaoEntrega(this.cboRegiaoEntrega);

            if (realizandoVenda)
            {
                this.btnNovo.PerformClick();
                if (entidade != null)
                    carregarCliente(entidade);
                else
                    this.txtTelResidencial.Text = this.telefone;

                entidade = null;
            }
        }

        #endregion

        #region *** Métodos ***
        private void carregarCliente(BECliente cliente)
        {
            this.lblCodigo.Text = cliente.Codigo.ToString();
            this.txtNome.Text = cliente.Nome;
            this.txtEndereco.Text = cliente.Endereco;
            this.txtPontoReferencia.Text = cliente.PontoReferencia;
            this.txtTelResidencial.Text = cliente.TelResidencial.Replace("-","").Insert(4, "-");

            if(!String.IsNullOrEmpty(cliente.TelResidencial2))
                this.txtTelResidencial2.Text = cliente.TelResidencial2.Insert(4, "-");

            if (!String.IsNullOrEmpty(cliente.TelComercial))
                this.txtTelResidencial3.Text = cliente.TelComercial.Insert(4, "-");

            this.cboRegiaoEntrega.SelectedValue = cliente.CodigoRegiaoEntrega;
        }

        private void PreencherCampos()
        {
            entidade = new BECliente();
            
            if (this.lblCodigo.Text != "...")
                entidade.Codigo = int.Parse(this.lblCodigo.Text);

            entidade.Nome = this.txtNome.Text;
            entidade.Bloqueado = false;
            entidade.DesejaReceberEmails = true;
            entidade.Endereco = this.txtEndereco.Text;
            entidade.PontoReferencia = this.txtPontoReferencia.Text;
            entidade.TelResidencial = this.txtTelResidencial.Text;
            entidade.TelResidencial2 = this.txtTelResidencial2.Text;
            entidade.TelComercial = this.txtTelResidencial3.Text;
            entidade.CodigoRegiaoEntrega = int.Parse(this.cboRegiaoEntrega.SelectedValue.ToString());
        }

        private bool ValidarFormulario()
        {
            if (String.IsNullOrEmpty(this.txtNome.Text))
            {
                Utilidades.ExibirMensagem("Campo Nome é obrigatório.");
                return false;
            }

            if (String.IsNullOrEmpty(this.txtEndereco.Text))
            {
                Utilidades.ExibirMensagem("Campo Endereço é obrigatório.");
                return false;
            }

            if (String.IsNullOrEmpty(this.txtTelResidencial.Text))
            {
                Utilidades.ExibirMensagem("Campo Telefone Residencial é obrigatório.");
                return false;
            }

            if (cboRegiaoEntrega.SelectedValue.Equals(0))
            {
                Utilidades.ExibirMensagem("Campo Região de Entrega é obrigatório.");
                return false;
            }

            return true;
        }

        private void LimparCampos()
        {
            this.lblCodigo.Text = "...";
            this.txtNome.Apagar();
            this.txtEndereco.Apagar();
            this.txtPontoReferencia.Apagar();
            this.txtTelResidencial.Apagar();
            this.txtTelResidencial2.Apagar();
            this.txtTelResidencial3.Apagar();
            this.cboRegiaoEntrega.SelectedIndex = 0;
        }
        #endregion
    }
}
